#ifndef CVARIANT_H
#define CVARIANT_H

#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif

// 类型ID（内置类型+自定义类型基值）
typedef enum {
    TYPE_INVALID = -1,
    TYPE_INT = 0,
    TYPE_FLOAT = 1,
    TYPE_DOUBLE = 2,
    TYPE_STR = 3,
    TYPE_CUSTOM_BASE = 100
} TypeId;

// 不透明结构体（隐藏C++实现）
typedef struct CVariant CVariant;

// 1. 核心管理函数
struct CVariant* cvariant_create();
void cvariant_destroy(struct CVariant* var);

// 2. 自定义类型注册（返回类型ID）
//  - size: 类型大小
//  - copy: 复制函数（src->dest）
//  - destroy: 销毁函数（释放内部资源）
TypeId cvariant_register_custom_type(size_t size,
                                   void (*copy)(const void* src, void* dest),
                                   void (*destroy)(void* data));

// 3. 设置值（内置类型）
void cvariant_set_int(struct CVariant* var, int value);
void cvariant_set_float(struct CVariant* var, float value);
void cvariant_set_double(struct CVariant* var, double value);
void cvariant_set_str(struct CVariant* var, const char* value);

// 4. 设置值（自定义类型）
//  - type_id: 注册时返回的类型ID
//  - data: 指向自定义类型数据的指针
int cvariant_set_custom(struct CVariant* var, TypeId type_id, const void* data);

// 5. 获取类型ID
TypeId cvariant_get_type(const struct CVariant* var);

// 6. 获取值（内置类型）
int cvariant_get_int(const struct CVariant* var);
float cvariant_get_float(const struct CVariant* var);
double cvariant_get_double(const struct CVariant* var);
const char* cvariant_get_str(const struct CVariant* var);

// 7. 获取值（自定义类型）
//  - dest: 用于接收数据的缓冲区（需提前分配足够空间）
int cvariant_get_custom(const struct CVariant* var, void* dest);

#ifdef __cplusplus
}
#endif

#endif // CVARIANT_H